#include "pwm.h"

void PWM_Init(void)
{
		GPIO_InitTypeDef GPIO_InitStructure;
		TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
		//定时一个该结构体
		TIM_OCInitTypeDef  TIM_OCInitStructure; 
	
		//库函数使能 TIM14 时钟
		RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14,ENABLE);
		//还需要使用到GPIOF9，所以也要使能该引脚 
		RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE); 
	
		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; 		//GPIOF9
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; 	//配置引脚为复用功能
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;  //速度 100MHz
		GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; 	//推挽复用输出
		GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; 	//上拉
		GPIO_Init(GPIOF,&GPIO_InitStructure); 	//初始化 PF9，用库函数寄存器

		//由于使用到PF9的复用功能，利用库函数使其引脚与TIM14定时器
		GPIO_PinAFConfig(GPIOF,GPIO_PinSource9,GPIO_AF_TIM14); 
		
		//设置定时器的的自动重装载的值
		TIM_TimeBaseStructure.TIM_Period=1000-1; 
		//设置定时器的分频值
		TIM_TimeBaseStructure.TIM_Prescaler=84; //84MHz/84 = 1MHz
		//设置定时器为向上计数模式
		TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
		//设置定时器的时钟分频因子
		TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
		TIM_TimeBaseInit(TIM14,&TIM_TimeBaseStructure);//初始化定时器 14

		
		//选择PWM的模式，选择PWM模式1
		TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; 
		//用于设置输出的使能，使能PWM输出到端口
		TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; 
		//输出的极性，输出是高电平还是低电平，这里选择低。
		TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //低电平时间/周期时间
		//根据设定信息配置TIM14 OC1,通道1使能
		TIM_OC1Init(TIM14, &TIM_OCInitStructure); 
		
		//使能预装载寄存器
		TIM_OC1PreloadConfig(TIM14, TIM_OCPreload_Enable); 
		
		//使能自动重装载的预装载寄存器允许位	
		TIM_ARRPreloadConfig(TIM14,ENABLE);

		TIM_Cmd(TIM14,ENABLE); //⑤使能定时器 3
}


//PE13 -- TIM1_CH3
void PWM1_Init(void)
{
		GPIO_InitTypeDef GPIO_InitStructure;
		TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
		//定时一个该结构体
		TIM_OCInitTypeDef  TIM_OCInitStructure; 
	
		//库函数使能 TIM1 时钟
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
		//还需要使用到GPIOE，所以也要使能该引脚 
		RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE); 
	
		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; 		//GPIOF9
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; 	//配置引脚为复用功能
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;  //速度 100MHz
		GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; 	//推挽复用输出
		GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; 	//上拉
		GPIO_Init(GPIOE,&GPIO_InitStructure); 	//初始化 PF9，用库函数寄存器

		//由于使用到PF9的复用功能，利用库函数使其引脚与TIM14定时器
		GPIO_PinAFConfig(GPIOE,GPIO_PinSource13,GPIO_AF_TIM1); 
		
		//设置定时器的的自动重装载的值
		TIM_TimeBaseStructure.TIM_Period=1000-1; 
		//设置定时器的分频值
		TIM_TimeBaseStructure.TIM_Prescaler=168; //168MHz/168 = 1MHz
		//设置定时器为向上计数模式
		TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
		//设置定时器的时钟分频因子
		TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
		TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure);//初始化定时器 14

		
		//选择PWM的模式，选择PWM模式1
		TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; 
		//用于设置输出的使能，使能PWM输出到端口
		TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; 
		//输出的极性，输出是高电平还是低电平，这里选择低。
		TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //低电平时间/周期时间
		//设置当前计数值
		TIM_OCInitStructure.TIM_Pulse=0;
		//根据设定信息配置TIM14 OC1,通道1使能
		TIM_OC3Init(TIM1, &TIM_OCInitStructure); 
		
		//使能预装载寄存器
		TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable); 
		
		//使能自动重装载的预装载寄存器允许位	
		TIM_ARRPreloadConfig(TIM1,ENABLE);

		TIM_Cmd(TIM1,ENABLE); //⑤使能定时器 3
		
		//高级定时器使能控制
		TIM_CtrlPWMOutputs(TIM1, ENABLE);
}


